home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / gpen32k / source / lib / osrc / menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  4.4 KB  |  232 lines

  1. /*
  2.             Towns Menu-Bar   ver. 0.002
  3.                             Copyright(C) 1993 Okome
  4. */
  5.  
  6. #include <string.h>
  7. #include <EGB.H>
  8. #include <MOS.H>
  9. #include <kkstr2.h>
  10. #include <sidework.h>
  11. #include <normlib.h>
  12. #include <okome.h>
  13.  
  14. extern char work[];
  15. extern char *MEN_title[];
  16. extern int MEN_kazu[];
  17. static int mex[16], mel[16], ebf;
  18.     int MEN_si=0, MEN_ss;
  19.     void (*MEN_sdkexec)();
  20.  
  21. static int ml( int i )
  22. {
  23.     int k, l=0;
  24.     for (k=0; k<=i; k++)
  25.         l+=MEN_kazu[k];
  26.     return (l);
  27. }
  28.  
  29. static int ubs( int i, int m )
  30. {
  31.     static int j=-1, n=0;
  32.     int k, l;
  33.     if (j != i)
  34.     {
  35.         if (j >= 0)
  36.         {
  37.             ubox2( mex[j], 0, mex[j+1]-1, 19, 15, 8 );
  38.             OKM_gth(mex[j],20,mex[j]+mel[j],23+MEN_kazu[j+1]*16,0);
  39.         }
  40.         j = i;
  41.         n = 0;
  42.         if (i >= 0)
  43.         {
  44.             ubox2( mex[i], 0, mex[i+1]-1, 19, 1+(i==0)*7, 1+(i==0)*7 );
  45.             OKM_gth(mex[j],20,mex[j]+mel[j],23+MEN_kazu[j+1]*16,1);
  46.             boxbf( mex[i], 20, mex[i]+mel[i]-2, 21+MEN_kazu[i+1]*16, 8, 15 );
  47.             boxb( mex[i], 20, mex[i]+mel[i]-1, 22+MEN_kazu[i+1]*16, 8 );
  48.             boxb( mex[i], 20, mex[i]+mel[i], 23+MEN_kazu[i+1]*16, 8 );
  49.             l = ml(i);
  50.             for (k=0; k<MEN_kazu[i+1]; k++)
  51.             {
  52.                 if (strcmp(MEN_title[l+k],"#")==0)
  53.                     line( mex[i]+6, 28+k*16, mex[i]+mel[i]-8, 28+k*16, 8 );
  54.                 else
  55.                     font12( mex[i]+8, 35+k*16, MEN_title[l+k], 8 );
  56.             }
  57.         }
  58.     }
  59.     if ( i>=0 )
  60.     {
  61.         if ( m!=n )
  62.         {
  63.             EGB_writeMode( work, 4 );
  64.             if (n>0)
  65.             {
  66.                 boxf( mex[i]+1, n*16+5, mex[i]+mel[i]-3, n*16+20, 7 );
  67.             }
  68.             if (m>0)
  69.             {
  70.                 boxf( mex[i]+1, m*16+5, mex[i]+mel[i]-3, m*16+20, 7 );
  71.             }
  72.             EGB_writeMode( work, 0 );
  73.             n = m;
  74.         }
  75.         if (m > 0)
  76.         {
  77.             return (i*100+m);
  78.         }
  79.     }
  80.     return (0);
  81. }
  82.  
  83. static int menx(int mx)
  84. {
  85.     int i = 1;
  86.     while ( mex[i] <= mx )
  87.         i++;
  88.     return (i-1);
  89. }
  90.  
  91. static int mebox( int mb, int k )
  92. {
  93.     int i = 0, j, mx, my, l;
  94.     l = k*23;
  95.     while (mb != 0)
  96.     {
  97.         MOS_rdpos( &mb, &mx, &my );
  98.         j=i;
  99.         i = ( mx >= 610-l && mx <=629-l && my < 20 ) ? 1 : 0 ;
  100.         if (j!=i)
  101.         {
  102.             MOS_disp( 0 );
  103.             ubox2( 610-l, 0, 629-l, 19, 15-i*7, 8 );
  104.             MOS_disp( 1 );
  105.         }
  106.     }
  107.     MOS_disp( 0 );
  108.     ubox2( 610-l, 0, 629-l, 19, 15, 8 );
  109.     MOS_disp( 1 );
  110.     return (i);
  111. }
  112.  
  113. int MEN_menu( int mb, int mx, int my )
  114. {
  115.     int p, i, r = 0, j = -1, z = 1, mb2;
  116.     p = EGB_getWritePage( 0, 0 );
  117.     EGB_writePage( work, 0 );
  118.     if ( mb && mex[MEN_kazu[0]] > mx && my < 20 )
  119.     {
  120.         while ( z != 0 )
  121.         {
  122.             mb2 = mb;
  123.             MOS_rdpos( &mb, &mx, &my );
  124.             if ( mex[MEN_kazu[0]] > mx && my < 20 )
  125.             {
  126.                 if ( mb )
  127.                 {
  128.                     i = menx(mx);
  129.                     if ( j!=i || r )
  130.                     {
  131.                         MOS_disp( 0 );
  132.                         r = ubs( i, 0 );
  133.                         MOS_disp( 1 );
  134.                         j = i;
  135.                     }
  136.                     z = 2;
  137.                 }    else    {
  138.                     z = 1;
  139.                 }
  140.             }
  141.             if ( mex[j] <= mx && mex[j]+mel[j] >= mx &&
  142.                  20 < my && my < 21 + MEN_kazu[j+1] * 16 )
  143.             {
  144.                 if (mb!=0)
  145.                 {    /*    SUB menuの処理    */
  146.                     i = (my - 21) / 16;
  147.                     MOS_disp( 0 );
  148.                     r = ubs( j, i+1 );
  149.                     MOS_disp( 1 );
  150.                     z = 3;
  151.                 }    else    {
  152.                     if ( z==3 && mb2 )
  153.                     {
  154.                         z = 0;
  155.                     }
  156.                     if ( z==2 )
  157.                     {
  158.                         z = 1;
  159.                     }
  160.                 }
  161.             }    else    {
  162.                 if ( z==3 && mb)
  163.                 {
  164.                     MOS_disp( 0 );
  165.                     r = ubs(j, 0);
  166.                     MOS_disp( 1 );
  167.                     z = 4;
  168.                 }
  169.                 if ( (mex[MEN_kazu[0]] > mx && my < 20)==0 )
  170.                 {
  171.                     if (((z==1) && mb) || ((z==2 || z==4) && mb==0))
  172.                     {
  173.                         z = 0;
  174.                     }
  175.                 }
  176.             }
  177.         }
  178.         MOS_disp( 0 );
  179.         ubs( -1, 0 );
  180.         MOS_disp( 1 );
  181.         do    {
  182.             MOS_rdpos( &mb, &mx, &my );
  183.         }    while( mb != 0 );
  184.     }    else    {
  185.         if ( mx >= 633-23*ebf && mx <= 629 && my < 20 && (629-mx) % 23 < 20)
  186.         {    /*    ENDボタン    */
  187.             i = (629-mx) / 23;
  188.             if (mebox( mb, i ))
  189.                 r = 9999 - i;
  190.         }
  191.     }
  192.     if (MEN_si-MEN_kazu[0]<r && MEN_si-MEN_kazu[0]+MEN_ss>=r)
  193.     {
  194.         MEN_sdkexec(r-MEN_si+MEN_kazu[0]);
  195.         r = 0;
  196.     } else {
  197.         if (r / 100 == 0 && MEN_si-MEN_kazu[0]+MEN_ss<r)
  198.         {
  199.             r-=MEN_ss;
  200.         }
  201.     }
  202.     EGB_writePage( work, p );
  203.     return (r);
  204. }
  205.  
  206. void MEN_set( int b )
  207. {
  208.     int i, j=0, k, l;
  209.     boxbf( 0, 0, 639, 19, 0, 7 );
  210.     ebf = b;
  211.     for (i = 0; i < MEN_kazu[0]; i++)
  212.     {
  213.         j += strlen(MEN_title[i])*6+42;
  214.         mex[i+1] = j;
  215.         boxf( mex[i], 0, j-1, 19, 1+(i==0)*7 );
  216.         ubox2( mex[i], 0, j-1, 19, 15, 8 );
  217.         font12( mex[i]+13, 16, MEN_title[i], 15 );
  218.         polygon(3,j-17,10,j-9,10,j-13,14,0x22,8);
  219.         l = ml(i);
  220.         for (k=0; k<MEN_kazu[i+1]; k++)
  221.         {
  222.             if ( strlen(MEN_title[l+k])*6+28 > mel[i] )
  223.                 mel[i] = strlen(MEN_title[l+k])*6+30;
  224.         }
  225.     }
  226.     for (i = 0; i < b; i++)
  227.     {
  228.         boxf( 610-i*23, 0, 629-i*23, 19, 8 );
  229.         ubox2( 610-i*23, 0, 629-i*23, 19, 15, 8 );
  230.     }
  231. }
  232.